import { getSetting,chooseAddress,openSetting,showModal,showToast } from "../../utils/asyncWx.js";

Page({
  data: {
    address:{},
    cart:[],
    allChecked:false,
    totalPrice:0,
    totalNum:0
  },
  //options(Object)
  onLoad: function(options){
    
  },
  //添加收货地址
  async handleChooseAddress(){
    //1 获取权限状态
   /* wx.getSetting({
      success: (result)=>{
    //2 当属性名怪异时，使用[]进行获取属性值操作
        const scopeAddress=result.authSetting["scope.address"];
        if(scopeAddress===true||scopeAddress===undefined){
          wx.chooseAddress({
            success: (result1)=>{
              
            },
          });
        }else{
          //3 诱导用户打开授权界面
          wx.openSetting({
            success: (result2)=>{
          //4 调用获取收货地址代码
            }
          });
        }
      }
    });*/
    /*//1 获取权限状态
    const res1=await getSetting();
    const scopeAddress=res1.authSetting["scope.address"];
    //2 判断权限状态
    if(scopeAddress===true||scopeAddress===undefined){
    //3 调用获取收货地址api
    const res2=await chooseAddress();
    console.log(res2);
    }else{
    //4 诱导用户打开授权界面
    await openSetting();
    //5 调用获取收货地址代码
    const res4=await chooseAddress();
    console.log(res4);
    }*/
    //1 获取权限状态
    try{
      const res1=await getSetting();
      const scopeAddress=res1.authSetting["scope.address"];
      //2 判断权限状态
      if(scopeAddress===false){
      await openSetting();
      }
      //3 调用获取收货地址代码
      const address=await chooseAddress();
      //获取详细地址
      address.all=address.provinceName+address.cityName+address.countyName+address.detailInfo;
      //4 存入到缓存中
      wx.setStorageSync("address", address);
    }catch(error){
      console.log(error);
    }
  },
  onShow(){
    //获取缓存中的收货地址
    let address=wx.getStorageSync("address");
    //获取购物车数据
    const cart=wx.getStorageSync("cart")||[];
    //计算全选
    //注：every数组方法会遍历数组，然后接收一个回调函数，如果每一个回调函数都返回true，结果为true
    //只要有一个回调函数返回了false，那么不再执行循环，返回false
    //空数组调用every，返回值就是true
    //const allChecked=cart.length?cart.every(v=>v.checked):false;--进行优化在下面的循环中
   /* let allChecked=true;
    //总价格 总数量
    let totalNum=0;
    let totalPrice=0;
    //给数组做循环
    cart.forEach(v=>{
      if(v.checked){
        totalPrice+=v.num*v.goods_price;
        totalNum+=v.num;
      }else{
        allChecked=false;
      }
    })
    //判断cart是否为空数组，将allChecked改为false
    allChecked=cart.length!=0?allChecked:false;
    //给data赋值
    this.setData({
      address,
      cart,
      allChecked,
      totalPrice,
      totalNum
    })*/
    this.setCart(cart);
    //在存个地址
    this.setData({
      address
    })
  },
  //复选框点击事件
  handleItemChange(e){
    //1 获取修改的商品id
    const goods_id=e.currentTarget.dataset.id;
    //2 获取购物车数组--从data里面进行获取
    let {cart}=this.data;
    //3 找到被修改的商品对象
    let index=cart.findIndex(v=>v.goods_id===goods_id);
    //4 选中状态取反
    cart[index].checked=!cart[index].checked;
    //5 6 将购物车数据重新设置回缓存和data中
    // this.setData({
    //   cart
    // });
    // wx.setStorageSync("cart", cart);
    this.setCart(cart);
  },
  //全选框绑定事件
  handleItemAllChange(){
    //1 获取变量
    let {allChecked,cart}=this.data;
    //2 取反
    allChecked=!allChecked;
    //3 遍历数组，使选中改变
    cart.forEach(v=>v.checked=allChecked);
    //4 将数据重新丢回data和缓存中
    this.setCart(cart);
  },
  //加减的数量点击事件
  async handleItemNumEdit(e){
    //1 获取参数
    const {operation,id}=e.currentTarget.dataset;
    //2 获取data中的购物车数据
    let {cart}=this.data;
    //3 进行id比较获取对象索引
    const index=cart.findIndex(v=>v.goods_id===id);
    //4 修改对象的num属性
    if(cart[index].num===1&&operation===-1){
      const res=await showModal({content:"您是否要删除"});
      if(res.confirm){
        cart.splice(index,1);//索引，删除数量
        //this.setCart(cart);
        //由于showModal是一个回调函数，且success又是一个函数，而this调用的是当前整个showModal对象，
        //因此需要把success改成一个箭头函数,而不是回调函数
        //箭头函数的this是继承箭头函数的上一层作用域里面的方法吧
      }
    }else{
      cart[index].num+=operation;
    }
      //弹窗提示
      /*wx.showModal({
        title: '提示',
        content: '您是否要删除',
        success: (result) => {
          if(result.confirm){
            cart.splice(index,1);//索引，删除数量
            this.setCart(cart);
            //由于showModal是一个回调函数，且success又是一个函数，而this调用的是当前整个showModal对象，
            //因此需要把success改成一个箭头函数,而不是回调函数
            //箭头函数的this是继承箭头函数的上一层作用域里面的方法吧
          }else if(result.cancel){
          }
        }
      });*/
    //5 再将数组丢回去data和缓存
    this.setCart(cart);
  },
  //设置购物车状态时 重新计算 底部工具栏状态，全选，价格，数量
  setCart(cart){
    let allChecked=true;
    //总价格 总数量
    let totalNum=0;
    let totalPrice=0;
    //给数组做循环
    cart.forEach(v=>{
      if(v.checked){
        totalPrice+=v.num*v.goods_price;
        totalNum+=v.num;
      }else{
        allChecked=false;
      }
    });
    //判断cart是否为空数组，将allChecked改为false
    allChecked=cart.length!=0?allChecked:false;
    //给data赋值
    this.setData({
      cart,
      allChecked,
      totalPrice,
      totalNum
    });
    wx.setStorageSync("cart", cart);
  },
  //点击支付按钮事件
  async handlePay(){
    //1 判断有无收货地址信息
    const {address}=this.data;
    if(!address.userName){
      await showToast({title:"您还没有选择收货地址"});
      return;
    }
    //2 判断有没有选购商品
    const {totalNum}=this.data;
    if(totalNum===0){
      await showToast({title:"您还没有选购商品"});
      return;
    }
    //3 跳转到支付页面
    wx.navigateTo({
      url: '/pages/pay/pay'
    });
  }
});